package com.mf.ergate.service;

import com.mf.ergate.common.exception.BusinessException;
import com.mf.ergate.dao.IDao;
import com.mf.framework.common.model.Page;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * Web通用Service实现类
 * User: zhaoming
 * Date: 2016-06-24
 * To change this template use File | Settings | File Templates.
 **/
public class GenericService<T> implements IService<T> {

	private static Logger logger = LoggerFactory.getLogger(GenericService.class);

	@Autowired
    private IDao<T> iDao;

    /**
     * 新增实体对象
     *
     * @param entity     实体对象
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public T insert(T entity){
        iDao.insert(entity);
        return entity;
    }

    /**
     * 批量新增实体对象
     * @param entities 实体对象列表
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public List<T> batchInsert(List<T> entities){
    	 iDao.batchInsert(entities);
         return entities;
    }

    /**
     * 根据主键修改实体对象
     * @param entity 实体对象
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public Boolean updateByPrimaryKey(T entity){
    	return iDao.updateByPrimaryKey(entity);
    }

    /**
     * 根据唯一编号修改实体对象
     * @param entity 实体对象
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public Boolean updateByUniqueNo(T entity){
        return iDao.updateByUniqueNo(entity);
    }

    /**
     * 根据主键删除实体对象(物理删除)
     * @param id 主键
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public Boolean discardByPrimaryKey(Long id){
		if(id == null){
			throw new BusinessException(HttpServletResponse.SC_BAD_REQUEST, "执行物理删除方法时参数为空校验失败，字段包括: id");
		}
        return iDao.discardByPrimaryKey(id);
    }

    /**
     * 根据唯一编号删除实体对象(物理删除)
     * @param uniqueNo 唯一编号
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public Boolean discardByUniqueNo(String uniqueNo){
        if(StringUtils.isNotBlank(uniqueNo)){
            throw new BusinessException(HttpServletResponse.SC_BAD_REQUEST, "执行物理删除方法时参数为空校验失败，字段包括: uniqueNo");
        }
        return iDao.discardByUniqueNo(uniqueNo);
    }

    /**
     * 根据主键批量删除实体对象(物理删除)
     * @param entities 实体对象列表
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public Boolean discardByPrimaryKeys(List<T> entities) {
        return iDao.discardByPrimaryKeys(entities);
    }

    /**
     * 根据唯一编号批量删除实体对象(物理删除)
     * @param entities 实体对象列表
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public Boolean discardByUniqueNos(List<T> entities){
        return iDao.discardByUniqueNos(entities);
    }

    /**
     * 根据主键删除实体对象(逻辑删除)
     * @param entity 实体对象
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public Boolean deleteByPrimaryKey(T entity){
        return iDao.deleteByPrimaryKey(entity);
    }

    /**
     * 根据唯一编号删除实体对象(逻辑删除)
     * @param entity 实体对象
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public Boolean deleteByUniqueNo(T entity){
        return iDao.deleteByUniqueNo(entity);
    }

    /**
     * 根据主键批量删除实体对象(逻辑删除)
     * @param entities 实体对象列表
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public Boolean deleteByPrimaryKeys(List<T> entities){
        return iDao.deleteByPrimaryKeys(entities);
    }

    /**
     * 根据唯一编号批量删除实体对象(逻辑删除)
     * @param entities 实体对象列表
     * @return 执行结果 (true:成功; false:失败)
     */
    @Transactional
    public Boolean deleteByUniqueNos(List<T> entities){
        return iDao.deleteByUniqueNos(entities);
    }

    /**
     * 根据主键查询实体对象
     * @param id 主键
     * @return 实体对象
     */
    public T selectByPrimaryKey(Long id){
        return iDao.selectByPrimaryKey(id);
    }

    /**
     * 根据唯一编号查询实体对象
     * @param uniqueNo 唯一编号
     * @return 实体对象
     */
    public T selectByUniqueNo(String uniqueNo){
        return iDao.selectByUniqueNo(uniqueNo);
    }

    /**
     * 根据条件查询实体对象列表
     * @param entity 实体对象
     * @return 实体对象列表
     */
    public List<T> selectByCondition(Object entity) {
        return iDao.selectByCondition(entity);
    }

    /**
     * 根据条件查询实体对象数量
     * @param entity 实体对象
     * @return 实体对象列表
     */
    public Integer selectCount(Object entity) {
        return iDao.selectCount(entity);
    }

    /**
     * 分页查询实体对象列表
     * @param page 分页实体
     * @param entity 实体对象
     * @return 实体对象列表
     */
	public Page<T> selectPage(Page page, Object entity){
        return iDao.selectPage(page, entity);
    }
}
